From 12ebbe2bae28c0e170e76f61ade65b980ae36b55 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Tue, 16 Sep 2014 11:01:16 +0100 Subject: [PATCH] libxl: introduce libxl_userdata_unlink This will be used in later patch for xl to remove its "xl" userdata file. Both CTX lock and userdata lock are taken in this API. CTX lock is taken to maintain locking hierarchy, but it also has a side effect to protect against R-M-W by other threads. Userdata lock is used to protect against domain destruction. In general application should not rely on these internal locks to protect its own userdata files. It should deploys its own lock if it cares. Signed-off-by: Wei Liu Acked-by: Ian Campbell --- tools/libxl/libxl.h | 10 ++++++++++ tools/libxl/libxl_dom.c | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 3bee6596da..bc68cacdda 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -67,6 +67,13 @@ * the same $(XEN_VERSION) (e.g. throughout a major release). */ +/* LIBXL_HAVE_USERDATA_UNLINK + * + * If it is defined, libxl has a library function called + * libxl_userdata_unlink. + */ +#define LIBXL_HAVE_USERDATA_UNLINK 1 + /* LIBXL_HAVE_CPUPOOL_QUALIFIER_TO_CPUPOOLID * * If this is defined, libxl has a library function called @@ -1268,6 +1275,9 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid, * data_r and datalen_r may be 0. * On error return, *data_r and *datalen_r are undefined. */ +int libxl_userdata_unlink(libxl_ctx *ctx, uint32_t domid, + const char *userdata_userid); + int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo); int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 02384acdf7..ce0c4ac771 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -2016,6 +2016,32 @@ out: return rc; } +int libxl_userdata_unlink(libxl_ctx *ctx, uint32_t domid, + const char *userdata_userid) +{ + GC_INIT(ctx); + int rc; + + libxl__domain_userdata_lock *lock; + const char *filename; + + CTX_LOCK; + lock = libxl__lock_domain_userdata(gc, domid); + if (!lock) { + rc = ERROR_LOCK_FAIL; + goto out; + } + + filename = libxl__userdata_path(gc, domid, userdata_userid, "d"); + if (unlink(filename)) rc = ERROR_FAIL; + + libxl__unlock_domain_userdata(lock); +out: + CTX_UNLOCK; + GC_FREE; + return rc; +} + /* * Local variables: * mode: C -- 2.30.2